package com.qf.service.impl;

import com.qf.config.IdWorker;
import com.qf.constant.CacheConstants;
import com.qf.feign.CacheFeign;
import com.qf.model.StandardSubmit;
import com.qf.service.FilterChainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 限流策略
 * 5分钟的限流策略/流量控制，5分钟之内对多发送3条短信
 * @author zhaojian
 */
@Service(value = "limitFiveMinutes")
@Slf4j
public class LimitFiveMinutesServiceImpl implements FilterChainService {


    @Autowired
    private CacheFeign cacheFeign;
    @Autowired
    private IdWorker idWorker;
    /**
     * **限流 : **限流规则如下
     *
     * - 五分钟内，禁止相同客户账户ID向同一手机号码下发相同的短信内容超过3条；
     * - 一小时内，禁止相同客户账户ID向同一手机号码下发相同的短信内容超过5条；
     * - 24小时内，禁止相同客户账户ID向同一手机号码下发相同的短信内容超过10条；
     *
     *
     * redis: RDB:
     *   save 900 15   : 15分钟之间有15Key发生变化就持久化
     *   save 300 1000  ：5分钟之间有1000key发生变化就持久化
     *   save 60  10000
     *
     *
     * - 如果超限就把发送日志存到Elasticsearch，如果同时是HTTP的发送方式就模拟出状态报告推送给客户。
     * @param submit
     * @return
     */
    @Override
    public boolean strategy(StandardSubmit submit) {

        Integer clientID = submit.getClientID();
        String destMobile = submit.getDestMobile();
        //String messageContent = submit.getMessageContent();



        //   一小时内，禁止相同客户账户ID向同一手机号码下发的短信内容超过5条；
        // limit:客户ID:手机号
        String cacheKey = CacheConstants.CACHE_PREFIX_SMS_LIMIT + clientID + ":" + destMobile;

        //从当前算起  一小时之前的时间是多少
        Calendar calendar = Calendar.getInstance();
        //未来的一小时之后的时候
        //calendar.add(Calendar.HOUR,1);
        //过去一小时之前的时间是多少
        //calendar.add(Calendar.HOUR,-1);
        calendar.add(Calendar.SECOND,-5);
        //过去1小时的时间
        long timeInMillis = calendar.getTimeInMillis();
        //时间戳  当前时间
        long ct = System.currentTimeMillis();
        //本次也算限流之内
        cacheFeign.zAddObject(cacheKey,idWorker.nextId(),ct);
        Long count = cacheFeign.zCount(cacheKey, timeInMillis, ct);
        if(count > 5){
            //必须限流
            System.out.println("限流了！！！");
            return false;
        }
        //可以不限流
        System.out.println("不限流!!!!");
        return true;
    }
}